package com.minigame.common;

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;

import static java.util.stream.Collectors.toList;

public class PageUtil {

    /**
     * 分页查询汇总, 第一页序号默认1
     * @param pageSize 每页条数
     * @param pageAction 分页查询
     * @param mapping 查询结果对象转换方法
     * @param <T> 记录类型
     * @param <R> 返回集合类型
     * @return 按页查询后转换结果并汇总
     */
    public static <T, R> List<R> summaryByPage(int pageSize, BiFunction<Integer, Integer, List<T>> pageAction, Function<T, R> mapping) {
        return summaryByPage(pageSize, pageAction, false, mapping);
    }

    /**
     * 分页查询汇总
     * @param pageSize 每页条数
     * @param pageAction 分页查询
     * @param zeroStart 第一页序号是否为0
     * @param mapping 查询结果对象转换方法
     * @param <T> 记录类型
     * @param <R> 返回集合类型
     * @return 按页查询后转换结果并汇总
     */
    public static <T, R> List<R> summaryByPage(int pageSize, BiFunction<Integer, Integer, List<T>> pageAction, boolean zeroStart, Function<T, R> mapping) {
        int pageNo = zeroStart ? 0 : 1;
        List<R> result = new ArrayList<>();
        List<T> records;
        while (!CollectionUtils.isEmpty(records = pageAction.apply(pageNo, pageSize))) {
            pageNo++;
            result.addAll(convert(records, mapping));
            if (records.size() < pageSize) {
                break;
            }
        }
        return result;
    }

    /**
     * 根据规则转换返回结果
     * @param records 查询记录
     * @param mapping 映射关系
     * @param <T> 查询结果类型
     * @param <R> 返回类型
     * @return 转换结果并返回
     */
    public static <T, R> List<R> convert(List<T> records, Function<T, R> mapping) {
        return records.stream().map(mapping).collect(toList());
    }
}
